/**
 * 
 */
package co.edu.javeriana.ia.ga;

import java.io.Serializable;

/**
 * <p>
 * Representa un descriptor, secuencia de tres caracteres (A, G, C, T) y la
 * proporcion de GC. Los descriptores son de 1 - 33, y fueron extraidos de la
 * fase de procesamiento.
 * </p>
 * 
 * @author <a href=f.triana@javeriana.edu.co">Alejandro Triana</a>
 * @version 1.0
 */
public class Descriptor implements Serializable, Comparable<Descriptor> {

	private static final long serialVersionUID = 1L;

	private int internalId;

	private String id;

	private int frecuency;
	
	private boolean match;

	/**
	 * <p>
	 * Id interno del descriptor dentro del sistema. Corresponde a un valor
	 * entre 0 - 32 (Indice de base 0)
	 * </p>
	 */
	public int getInternalId() {
		return internalId;
	}

	public void setInternalId(int internalId) {
		this.internalId = internalId;
	}

	/**
	 * <p>
	 * Corresponde al id propiamente dicho del descriptor. Una secuencia de 3
	 * caracteres en el dominio AGTC
	 * </p>
	 */
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	/**
	 * <p>
	 * Corresponde a la frecuencia, deacuerdo a la discretizacion
	 * </p>
	 */
	public int getFrecuency() {
		return frecuency;
	}

	public void setFrecuency(int frecuency) {
		this.frecuency = frecuency;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {

		if (!(obj instanceof Descriptor)) {
			return false;
		} else {
			Descriptor other = (Descriptor) obj;
			return other.getInternalId() == this.getInternalId();
		}
	}
	
	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		
		StringBuilder build = new StringBuilder();
		
		build.append(internalId).append(Constants.PROPERTY_SEPARATOR);
		build.append(id).append(Constants.PROPERTY_SEPARATOR);
		build.append(frecuency);
		
		return build.toString();
	}
	
	/**
	 * <p>
	 * Permite obtener el objeto desde una cadena
	 * </p>
	 */
	public static Descriptor getFromString(String value) {
		Descriptor descriptor = new Descriptor();
		
		String[] strProps = value.split(Constants.PROPERTY_SEPARATOR);
		descriptor.setInternalId(Integer.valueOf(strProps[0]));
		descriptor.setId(strProps[1]);
		descriptor.setFrecuency(Integer.valueOf(strProps[2]));
		
		return descriptor;
		
	}
	
	/**
	 * <p>
	 * Permite realizar la comparacion de los objetos
	 * </p>
	 */
	@Override
	public int compareTo(Descriptor o) {
		
		if(o != null) {
			Integer oInternalId = o.getInternalId();
			Integer internalId = Integer.valueOf(this.internalId);
			
			return internalId.compareTo(oInternalId);
		} else {
			return 1;
		}
	}
	
	/**
	 * <p>
	 * Permite determinar si el descriptor hizo match
	 * </p>
	 */
	public boolean isMatch() {
		return match;
	}

	public void setMatch(boolean match) {
		this.match = match;
	}

}
